let a = {
  name: 'a',
  func() {
    return 'name---' + this.name
  }
}
// 赋值到b的proto原型上
let b = Object.create(a)

console.log(b)   //{}
console.log(a === b.__proto__) //true
console.log(b.name);  //a     可以通过proto访问到a的name


//TODO:Object.create()的属性，可枚举、可删除、可修改 默认都是false
let obj = Object.create(a,{
  age:{
    value:18,
    enumerable:false, //可枚举，设为true：for枚举可以取到，false:取不到
    configurable:false, //可删除 可删除一样
    writable:false,  //赋值
  },
  age2:{
    value:20,
    enumerable:true,
    writable:true,
  }
})
console.log('----enumerable----')
for(let item in obj){
  console.log(item, obj[item]);
}
obj.age=33;  //重新赋值age，但因为可删除属性是false，修改失败
console.log(obj.age)  // 18

obj.age2=44;
console.log(obj.age2)  //44

console.log('--------')

//TODO:手动实现  Object.create()
//简单版
function objectCreate(obj) {
  const F = function () {};
  F.prototype = obj;
  return new F();
}

let c = objectCreate(a)
console.log(c.__proto__)

// 完整版
Object.create2 = function (prototype, properties) {
    if (typeof prototype !== "object") {
        throw TypeError();
     }
    function Ctor() {}
    Ctor.prototype = prototype;
    const o = new Ctor();
    if (prototype) {
        o.constructor = Ctor;
    }
    if (properties !== undefined) {
      if (properties !== Object(properties)) {
          throw TypeError();
       }
      //直接在一个对象上定义一个或多个新的属性或修改现有属性，并返回该对象。
      Object.defineProperties(o, properties);
    }
    return o;
};
